package com.excesys;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk动态代理类
 */
public class Proxy02 {
    //维护一个目标对象
    private Object target;

    public Proxy02(Object target) {
        this.target = target;
    }

    //给目标对象生成代理对象
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this::invoke);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始事务2");
        //执行目标对象方法
        Object returnValue = method.invoke(target, args);
        System.out.println("提交事务2");
        return returnValue;
    }

    public static void main(String[] args) {
        //目标对象
//        UserDao target = new UserDaoImpl();
        // 【原始的类型 class top.polygon.proxy01.dao.impl.UserDaoImpl】
//        System.out.println(target.getClass());
        // 给目标对象，创建代理对象
        UserDao proxy = (UserDao) new Proxy02(new UserDaoImpl()).getProxyInstance();
        // class $Proxy0   内存中动态生成的代理对象
//        System.out.println(proxy.getClass());
        proxy.getUser();//执行的是代理的方法
        proxy.insertUser();
    }

}
